JavaScript์—์„œ var, let, const์˜ ์ฐจ์ด๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ๋ฒ•์˜ ์ฐจ์ด๊ฐ€ ์•„๋‹ˆ๋‹ค. ์‹ค์ œ ์ฐจ์ด๋Š” JavaScript ์—”์ง„์ด ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹, ์ฆ‰ Execution Context ์ƒ์„ฑ ๊ณผ์ • ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Execution Context ๊ด€์ ์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์˜ ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


๐Ÿ’ก Execution Context์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

JavaScript๋Š” ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋จผ์ € Execution Context(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

Execution Context๋Š” ๋‘ ๋‹จ๊ณ„๋กœ ๋™์ž‘ํ•œ๋‹ค.

1. Creation Phase (์ƒ์„ฑ ๋‹จ๊ณ„)

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์—”์ง„์ด ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.

  • ๋ณ€์ˆ˜ ์„ ์–ธ ๋“ฑ๋ก
  • ํ•จ์ˆ˜ ์„ ์–ธ ๋“ฑ๋ก
  • this ๊ฒฐ์ •

์ด ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜์˜ ๋“ฑ๋ก ๋ฐฉ์‹๊ณผ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹์ด var, let, const ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค.

2. Execution Phase (์‹คํ–‰ ๋‹จ๊ณ„)

์ด์ œ ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋œ๋‹ค.

  • ๋ณ€์ˆ˜ ๊ฐ’ ํ• ๋‹น
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ

var / let / const์˜ ์ฐจ์ด๋Š” Creation Phase์—์„œ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.


๐Ÿ’ญ var์˜ ๋™์ž‘ ๋ฐฉ์‹

console.log(a);
var a = 10;

1. Creation Phase

์—”์ง„์€ var a๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๋™์‹œ์— undefined๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.

// ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ
a: undefined

์ฆ‰, var๋Š” ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„๋‹ค.

2. Execution Phase

console.log(a); // undefined

์ด๋ฏธ a๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ผ undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ด ํ˜„์ƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” Hoisting์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒ์ด๋‹ค.


๐Ÿ’ญ let / const์˜ ๋™์ž‘ ๋ฐฉ์‹

console.log(a);
let a = 10;

1. Creation Phase

์—”์ง„์€ ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™” ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

// ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ
a: <uninitialized>

๋ณ€์ˆ˜๋Š” ์กด์žฌํ•˜์ง€๋งŒ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

2. Execution Phase

console.log(a); // ReferenceError

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด ๊ตฌ๊ฐ„์„ TDZ (Temporal Dead Zone) ๋ผ๊ณ  ํ•œ๋‹ค.




๐Ÿ’ก TDZ (Temporal Dead Zone)๋ž€?

๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์•„์ง ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ๊ฐ„

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ !

  • TDZ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ตฌ๊ฐ„์ด ์•„๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜๋Š” ์กด์žฌํ•˜์ง€๋งŒ ์ ‘๊ทผ์ด ๊ธˆ์ง€๋œ ๊ตฌ๊ฐ„์ด๋‹ค.

TDZ๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ์ด ์‹œ์ž‘๋˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ ์‹ค์ œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์‹œ์ ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.


๐Ÿ”Ž ์™œ TDZ๊ฐ€ ์ƒ๊ฒผ์„๊นŒ?

var์—๋Š” ์˜ค๋ž˜๋œ ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

1. ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๋ฌด์‹œํ•œ๋‹ค

if (true) {
  var a = 10;
}

console.log(a); // 10

๋ธ”๋ก ๋‚ด๋ถ€ ๋ณ€์ˆ˜์ธ๋ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ์„ ์–ธ ์ „์— ์‚ฌ์šฉํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ์—†๋‹ค

console.log(a); // undefined
var a = 10;

๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๊ทธ๋ž˜์„œ ES6์—์„œ๋Š” ๋‹ค์Œ ๋ชฉํ‘œ๋กœ let๊ณผ const๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค :

  • ๋ธ”๋ก ์Šค์ฝ”ํ”„ ์ œ๊ณต
  • ์„ ์–ธ ์ „ ์ ‘๊ทผ ๋ฐฉ์ง€
  • ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์ž‘์„ฑ
  • ๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ ๊ฐ์†Œ

TDZ๋Š” ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ๋ง‰๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”Ž const๋Š” ์™œ ๋‚ด๋ถ€ ๊ฐ’ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ• ๊นŒ?

const obj = { a: 1 };
obj.a = 2; // ๊ฐ€๋Šฅ

const๋Š” ๊ฐ’์„ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ(binding)์„ ๊ณ ์ •ํ•œ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์žฌํ• ๋‹นํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‚ด๋ถ€ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

obj = {}; // โŒ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€

JavaScript๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(reference)๋กœ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




๐Ÿงถ ํ•ต์‹ฌ ์ •๋ฆฌ

๊ตฌ๋ถ„ var let const
์Šค์ฝ”ํ”„ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ธ”๋ก ์Šค์ฝ”ํ”„
์žฌ์„ ์–ธ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€ ๋ถˆ๊ฐ€
์žฌํ• ๋‹น ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€
Hoisting undefined ์ดˆ๊ธฐํ™” TDZ TDZ
์ดˆ๊ธฐํ™” ์‹œ์  Creation Phase Execution Phase Execution Phase

๊ฒฐ๊ตญ var, let, const์˜ ์ฐจ์ด๋Š” Hoisting์ด ๋˜๋А๋ƒ ์•ˆ ๋˜๋А๋ƒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ ์–ธ์€ Hoisting ๋œ๋‹ค.

์ง„์งœ ์ฐจ์ด๋Š”:

Execution Context์˜ Creation Phase์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐํ™”๋˜๋Š”๊ฐ€์˜ ์ฐจ์ด๋‹ค.

  • var : ์„ ์–ธ + ์ดˆ๊ธฐํ™” ๋™์‹œ์— ์ง„ํ–‰
  • let / const : ์„ ์–ธ๋งŒ ๋จผ์ € ์ง„ํ–‰ โ†’ TDZ ๋ฐœ์ƒ